package cn.edu.scau.serviceImpl;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import cn.edu.scau.dao.BlogDao;
import cn.edu.scau.entity.Blog;
import cn.edu.scau.entity.Comment;

import cn.edu.scau.service.BlogService;


@Service("blogServiceImpl")
public class BlogServiceImpl extends BaseServiceImpl<Blog> implements BlogService {

	// 一页展示的博客条数
	private int pageSize = 2;

	// 持久层
	@Autowired
	private BlogDao blogDao;

	public BlogDao getBlogDao() {
		return blogDao;
	}
	
	public void setBlogDao(BlogDao blogDao) {
		this.blogDao = blogDao;
	}

	public long getPageSize() {
		return pageSize;
	}

	public void setPageSize(int pageSize) {
		this.pageSize = pageSize;
	}

	/**
	 * 增添实体
	 * 
	 * @param entity
	 * Blog实体
	 */
	@Override
	public void add(Blog entity) {
		this.getBlogDao().save(entity);
	}

	/**
	 * 根据id删除实体
	 * 
	 * @param id
	 * 实体id
	 */
	@Override
	public synchronized boolean delete(Integer id) {
		if (this.find(id) != null) {
			this.getBlogDao().delete(Blog.class, id);
			return true;
		}
		return false;
	}

	/**
	 * 获取某一条博客
	 * 
	 * @param blogId
	 * 博客id
	 */
	public Blog find(Integer blogId) {
		return this.getBlogDao().find(Blog.class, blogId);
	}

	/**
	 * 查询所有的博客
	 * 
	 * @param pageNo
	 *  第几页
	 * @return
	 */
	public List<Blog> getAllBlog(Integer pageNo) {
		List<Blog> blogs = this.getBlogDao().getAllBlogByPage(pageNo, pageSize);
		System.out.println(blogs.size());
		return blogs;
	}


	/**
	 * 返回所有博客或者是某一用户博客页面总数
	 * 
	 * @param isAll
	 *是否是所有博客
	 * @param userId
	 *  用户id
	 * @return
	 */
	public long allOrSearchMaxpage(int type, String condition) {
		// 记录页面总数
		long tempPage = 0;
		// 记录博客条数
		long pageCount = 0;
		if (type == 0) {
			// 获取所有博客条数
			pageCount = this.getBlogDao().findCount(Blog.class);
		} else if (type == 1) {
			// 获取当前用户博客条数
			pageCount = this.getBlogDao().searchBlogsCount(condition);
		}
		System.out.println(pageCount);
		// 计算
		tempPage = (pageCount % pageSize == 0) ? pageCount / pageSize : pageCount / pageSize + 1;
		return tempPage;
	}

	/**
	 * 评论
	 * 
	 * @param comment
	 * 评论
	 * @param blogId 博客id
	 */
	public synchronized boolean comment(Comment comment, Integer blogId) {

		// 获得当前博客
		Blog blog = this.find(blogId);
		// 添加评论
		blog.getComments().add(comment);
		// 更新博客信息
		this.getBlogDao().update(blog);
		return true;

	}

	/**
	 * 获取所有的评论
	 * 
	 * @param blogId
	 *  博客id
	 * 
	 * @return
	 */
	public List<Comment> getAllComment(Integer blogId) {

		// 获得当前博客
		Blog blog = this.find(blogId);
		// 获得该博客的所有评论
		Set<Comment> coms = blog.getComments();
		// 转换成list集合
		List<Comment> comments = new ArrayList<Comment>(coms);
		return comments;
	}

	/**
	 * 点赞
	 * 
	 * @param blogId
	 *博客id
	 */
	public void upvote(Integer blogId) {
		// 获得当前博客
		Blog blog = this.find(blogId);
		int upvoteTimes = blog.getUpvoteNum();
		blog.setUpvoteNum(++upvoteTimes);
		this.update(blog);
	}

	/**
	 * 搜索博客
	 * 
	 * @param condition
	 * 搜索条件
	 * @return
	 */
	public List<Blog> searchBlogByCondition(String condition, Integer pageNo) {

		return this.getBlogDao().findBlogsByCondition(condition, pageNo, pageSize);
	}

	/**
	 * 列出当天点赞排行榜
	 * 
	 * @return
	 */
	public List<Blog> searchBlogByUpvoteRank() {

		return this.getBlogDao().findBlogByUpvoteRank(1);

	}

}